package com.example.daibanshiwu.pojo;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedJdbcTypes;
import org.apache.ibatis.type.MappedTypes;

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;

/**
 * 自定义TypeHandler，用于在 int[] 和 JSON字符串 之间转换
 */
@MappedJdbcTypes(JdbcType.VARCHAR) // 声明数据库中对应的类型是VARCHAR (或JSON)
@MappedTypes(int[].class)         // 声明这个Handler要处理的Java类型是 int[]
public class IntArrayJsonTypeHandler extends BaseTypeHandler<int[]> {

    private static final ObjectMapper objectMapper = new ObjectMapper();

    /**
     * 将Java的 int[] 类型参数设置到 PreparedStatement 中
     * (当执行 insert 或 update 时会用到)
     */
    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, int[] parameter, JdbcType jdbcType) throws SQLException {
        try {
            // 将 int[] 转换为 JSON 字符串
            ps.setString(i, objectMapper.writeValueAsString(parameter));
        } catch (JsonProcessingException e) {
            throw new SQLException("Error converting int[] to JSON string", e);
        }
    }

    /**
     * 从 ResultSet 中根据列名获取结果，并转换为 int[]
     * (这是你当前场景最需要的方法)
     */
    @Override
    public int[] getNullableResult(ResultSet rs, String columnName) throws SQLException {
        String json = rs.getString(columnName);
        return parseJson(json);
    }

    /**
     * 从 ResultSet 中根据列索引获取结果，并转换为 int[]
     */
    @Override
    public int[] getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        String json = rs.getString(columnIndex);
        return parseJson(json);
    }

    /**
     * 从 CallableStatement 中获取结果，并转换为 int[]
     */
    @Override
    public int[] getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        String json = cs.getString(columnIndex);
        return parseJson(json);
    }

    /**
     * 辅助方法：将JSON字符串解析为 int[]
     */
    private int[] parseJson(String json) throws SQLException {
        if (json == null || json.trim().isEmpty() || "null".equalsIgnoreCase(json.trim())) {
            return null;
        }
        try {
            // 1. 先将JSON数组解析为一个List<Integer>
            List<Integer> listWithDuplicates = objectMapper.readValue(json, new TypeReference<List<Integer>>() {});
            Set<Integer> uniqueSet = new LinkedHashSet<>(listWithDuplicates); // LinkedHashSet保持插入顺序
            return uniqueSet.stream().mapToInt(Integer::intValue).toArray();
            // 将 JSON 字符串转换为 int[]
//            return objectMapper.readValue(json, int[].class);
        } catch (JsonProcessingException e) {
            throw new SQLException("Error parsing JSON to int[]", e);
        }
    }
}
